/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package african11;

import java.math.BigDecimal;
import java.io.IOException;
import java.math.BigInteger;
import static chanlib.Chan_IO.*;

/**
 * @author robit
 */
public class RadioReciever{
    /*
      All neccesary to be defined
      including:
      variable, inner class
    */
    // static int A;
    // static void B();
    // static class C
    static int N;
    static int T[];
    static int P[];
    static boolean testD(BigDecimal D){
        BigDecimal inf=new BigDecimal(P[0]).subtract(D),sup=new BigDecimal(P[0]).add(D);
        for(int done=0;done<=N-2;done++){
            // expanding the valid set
            sup=sup.add(new BigDecimal(T[done+1]-T[done]));
            inf=inf.subtract(new BigDecimal(T[done+1]-T[done]));
            // intersect the set with [nextP-D,nextP+D]
            BigDecimal PplusD=new BigDecimal(P[done+1]).add(D);
            if(PplusD.compareTo(sup)<0)sup=PplusD;
            BigDecimal PminusD=new BigDecimal(P[done+1]).subtract(D);
            if(PminusD.compareTo(inf)>0)inf=PminusD;
            if(sup.compareTo(inf)<0)return false;
        }
        return inf.compareTo(sup)<=0;
    }
    static void insertionSort(){
        for(int j=1;j<N;j++){
            int key=T[j];
            int value=P[j];
            int i=j-1;
            while(i>=0&&T[i]>key){
                T[i+1]=T[i];
                P[i+1]=P[i];
                i--;
            }
            T[i+1]=key;
            P[i+1]=value;
        }
    }
    /*
       One calculation fits all of the cases.
    */
    static void preReckon(){
        return;
    }

    /*
      calculate the answer
    */
    private static void reckon(int line) {
        N=Int();
        P=new int[N];
        T=new int[N];
        for(int i=0;i<N;i++){
            P[i]=Int();
            T[i]=Int();
        }
        insertionSort();
        double Max=10E9;
        BigDecimal r=new BigDecimal(Max),l=BigDecimal.ZERO;
        BigDecimal two=new BigDecimal(2);
        BigDecimal tres=new BigDecimal(5e-10);
        while(r.subtract(l).compareTo(tres)>=0){
            if(testD(r.add(l).divide(two)))r=r.add(l).divide(two);
            else l=r.add(l).divide(two);
        }

        double maxD=0;
        for(int t1=0;t1<N;t1++){
            for(int t2=t1+1;t2<N;t2++){
                maxD=Math.max(maxD,(Math.abs(P[t1]-P[t2])-Math.abs(T[t1]-T[t2]))/2.0);
            }
        }

        double ans = maxD;
        String output=String.format("Case #%d: %f",line,ans);
        writeln(output, OUTFILE);
        //writeln(String.format("N=%d K=%d\n%d", N, ans),ANALFILE);
        //println(output);
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws IOException {
        /*
           Pre-computing for all cases
        */

        // Just in case!
        //preReckon();
        //while((char)read()!='P');

        /*
          Input-output
        */
        boolean test=false;
        boolean small=false;
        String prob="C";
        String filename;
        if(test) filename="test";
        else{
            if(small) filename=prob+"-small-practice";
            else filename=prob+"-large-practice";
        }
        try {
            /*
               Init IO,plus determination of input line number
             */
            int lineNums = initFileIO(filename);
            for (int i = 1; i <= lineNums; i++) {
                reckon(i);
            }
        } finally {
            endIO();
        }
    }

}
